home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 February / Gamestar_81_2006-02_dvd.iso / Red Shark / Common / BaseMission.script < prev    next >
Text File  |  2002-01-30  |  18KB  |  721 lines

  1. //-------------------------------------------------------------------
  2. //
  3. //  This code is copyright 2001 by G5 Software.
  4. //  Any unauthorized usage, either in part or in whole of this code
  5. //  is strictly prohibited. Violators WILL be prosecuted to the
  6. //  maximum extent allowed by law.
  7. //
  8. //-------------------------------------------------------------------
  9.  
  10. class CBaseMission extends CStrings, CMissionMessageColors
  11. {
  12.   //
  13.   //  settings
  14.   //
  15.  
  16.   //#TODO: set to true to see nav-point
  17.   final boolean m_EditorMode = false;// editor mode
  18.  
  19.   //
  20.   //  should be called by subclassing classes from their Init() method
  21.   //
  22.  
  23.   int m_nObjects2Load;
  24.   int m_nObjectsLoaded;
  25.  
  26.   void BaseMission_UpdateLoadProgress()
  27.   {
  28.     m_nObjectsLoaded = m_nObjectsLoaded + 1;
  29.     int percent = m_nObjectsLoaded * 1000 / m_nObjects2Load;
  30.  
  31.     Core_CallFunction(
  32.       SOID_GameMenu,
  33.       "SendCommandToControl",
  34.       "ID_LOAD_PROGRESS_BAR",
  35.       "SET_PROGRESS",
  36.       percent
  37.     );
  38.   }
  39.  
  40.   void BaseMission_InitMission()
  41.   {
  42.     m_bMissionStatusActive = false;
  43.     m_bMissionMenuActive   = false;
  44.     m_bMissionQuit         = false;
  45.  
  46.     array ids              = GetObjectsIDs();
  47.     m_nObjects2Load        = 6 + ids.size() + GetAutoGeneratedUnitsQty();
  48.     m_nObjectsLoaded       = 0;
  49.  
  50.     //
  51.     //  Create components common to all missions
  52.     //
  53.  
  54.     // CreateComponent(IDToRegister, ComponentID, ScriptName | FileName | "")
  55.     BaseMission_UpdateLoadProgress();
  56.     CreateComponent("Effects", "EffectsArray", "CEffectsArray");
  57.  
  58.     BaseMission_UpdateLoadProgress();
  59.     CreateComponent("Sounds", "SoundsArray", "CSoundsArray");
  60.  
  61.     BaseMission_UpdateLoadProgress();
  62.     CreateComponent("Bullets", "BulletsArray", "CBulletsArray");
  63.  
  64.     BaseMission_UpdateLoadProgress();
  65.     CreateComponent("Explosions", "ExplosionsArray", "CExplosionsArray");
  66.  
  67.     BaseMission_UpdateLoadProgress();
  68.     CreateComponent("RouterPrecalculatedGraph", "RouterPrecalculatedGraph", "CRouterPrecalculatedGraph");
  69.  
  70.     BaseMission_UpdateLoadProgress();
  71.     CreateComponent("LensFlare", "LensFlare", "");
  72.   }
  73.  
  74.   void BaseMission_CreateObjects()
  75.   {
  76.     //
  77.     //  Create individual mission components
  78.     //
  79.  
  80.     array ids     = GetObjectsIDs();
  81.     array clss    = GetObjectsScriptClassNames();
  82.     array cids    = GetObjectsScriptComponentIDs();
  83.     array matrs   = GetObjectsMatrices();
  84.     array behscrs = GetObjectsBehaviorScripts();
  85.     array cstprms = GetObjectsCustomParameters();
  86.  
  87.     for (int i = 0; i < ids.size(); i = i + 1)
  88.     {
  89.       BaseMission_UpdateLoadProgress();
  90.  
  91.       // do not create nav points in non editor mode
  92.       if ( clss[i] != "CNavPoint" || m_EditorMode)
  93.       {
  94.         CreateComponent( ids[i], cids[i], clss[i]);
  95.   
  96.         SetComponentPosition( ids[i], matrs[i]);
  97.  
  98.         if ( behscrs.type() == ST_ARRAY) // prevent failure of old style missions
  99.         {
  100.           if ( behscrs[i] != "")
  101.           {
  102.             SetBehaviorTask( ids[i], behscrs[i]);
  103.           }
  104.         }
  105.       }
  106.  
  107.       if ( clss[i] == "CNavPoint")
  108.       {
  109.         string str_radius;
  110.         if ( cstprms.type() == ST_ARRAY)
  111.           str_radius = cstprms[i];
  112.         else
  113.           str_radius = "";
  114.  
  115.         // tell AIController about NavPoint
  116.         Core_SendEventTo(
  117.           "AIController",
  118.           "OnAddNavPoint",
  119.           ids[i],      // name of nav-point
  120.           matrs[i],    // position of nav-point
  121.           Core_String2Float( str_radius)); // custom params - radiuses
  122.  
  123.         Core_SendEventTo(
  124.           ids[i],
  125.           "OnSetCustomParameter",
  126.           str_radius);
  127.       }
  128.     }
  129.   }
  130.  
  131.  
  132.   //
  133.   //
  134.   // *** routine functions
  135.   //
  136.   //
  137.  
  138.   void CreateUnitLine(
  139.     string  _NamePrefix,
  140.     string  _ObjectScript,
  141.     string  _AIScript,
  142.     int     _ObjectNum,
  143.     vector  _LineStart,
  144.     vector  _LineEnd)
  145.   {
  146.     for ( int u = 0; u < _ObjectNum; u = u + 1)
  147.     {
  148.       float x = Core_GetVectorX(_LineStart) + (Core_GetVectorX(_LineEnd) - Core_GetVectorX(_LineStart)) * u / _ObjectNum;
  149.       float y = Core_GetVectorY(_LineStart) + (Core_GetVectorY(_LineEnd) - Core_GetVectorY(_LineStart)) * u / _ObjectNum;
  150.  
  151.       BaseMission_UpdateLoadProgress();
  152.       CreateComponent( _NamePrefix + u, "GameObject", _ObjectScript);
  153.  
  154.       SetComponentPosition(
  155.         _NamePrefix + u,
  156.         matrix(
  157.           1.0, 0.0, 0.0, x,
  158.           0.0, 1.0, 0.0, y,
  159.           0.0, 0.0, 1.0, 0.0,
  160.           0.0, 0.0, 0.0, 1.0));
  161.  
  162.       SetBehaviorTask( _NamePrefix + u, _AIScript);
  163.     }
  164.   }
  165.  
  166.   void CreateUnitLineGroup(
  167.     string  _NamePrefix,
  168.     array   _GroupObjectScript,
  169.     array   _GroupAIScript,
  170.     array   _GroupObjectNum,
  171.     int     _ObjectNum,
  172.     vector  _LineStart,
  173.     vector  _LineEnd)
  174.   {
  175.     int GroupIndex = 0;
  176.     int InGroupIndex = 0;
  177.  
  178.     for ( int u = 0; u < _ObjectNum; u = u + 1)
  179.     {
  180.       float x = Core_GetVectorX(_LineStart) + (Core_GetVectorX(_LineEnd) - Core_GetVectorX(_LineStart)) * u / _ObjectNum;
  181.       float y = Core_GetVectorY(_LineStart) + (Core_GetVectorY(_LineEnd) - Core_GetVectorY(_LineStart)) * u / _ObjectNum;
  182.  
  183.       BaseMission_UpdateLoadProgress();
  184.       CreateComponent( _NamePrefix + u, "GameObject", _GroupObjectScript[GroupIndex]);
  185.  
  186.       SetComponentPosition(
  187.         _NamePrefix + u,
  188.         matrix(
  189.           1.0, 0.0, 0.0, x,
  190.           0.0, 1.0, 0.0, y,
  191.           0.0, 0.0, 1.0, 0.0,
  192.           0.0, 0.0, 0.0, 1.0));
  193.  
  194.       SetBehaviorTask( _NamePrefix + u, _GroupAIScript[GroupIndex]);
  195.  
  196.       InGroupIndex = InGroupIndex + 1;
  197.       if ( InGroupIndex >= int(_GroupObjectNum[GroupIndex]))
  198.       {
  199.         GroupIndex = GroupIndex + 1;
  200.         InGroupIndex = 0;
  201.       };
  202.     }
  203.   }
  204.  
  205.   void CreateUnitField(
  206.     string  _NamePrefix,
  207.     string  _ObjectScript,
  208.     string  _AIScript,
  209.     int     _ObjectNum,
  210.     vector  _Center,
  211.     float   _Radius)
  212.   {
  213.     for ( int u = 0; u < _ObjectNum; u = u + 1)
  214.     {
  215.       float x = Core_GetVectorX(_Center) + rand( -_Radius, _Radius);
  216.       float y = Core_GetVectorY(_Center) + rand( -_Radius, _Radius);
  217.  
  218.       BaseMission_UpdateLoadProgress();
  219.       CreateComponent( _NamePrefix + u, "GameObject", _ObjectScript);
  220.  
  221.       SetComponentPosition(
  222.         _NamePrefix + u,
  223.         matrix(
  224.           1.0, 0.0, 0.0, x,
  225.           0.0, 1.0, 0.0, y,
  226.           0.0, 0.0, 1.0, 0.0,
  227.           0.0, 0.0, 0.0, 1.0));
  228.  
  229.       SetBehaviorTask( _NamePrefix + u, _AIScript);
  230.     }
  231.   }
  232.  
  233.  
  234.  
  235.   //
  236.   //  Game Object destroyed handler
  237.   //
  238.  
  239.   void BaseMission_OnGameObjectDestroyed(string _id)
  240.   {
  241.     // "Helicopter" currently is a reserved id for a player's heli
  242.     if (_id == "Helicopter")
  243.     {
  244.       BaseMission_FastQuit();
  245.     }
  246.   }
  247.  
  248.   //
  249.   //  Delayed quit from mission method
  250.   //
  251.  
  252.   boolean m_bMissionQuit;
  253.  
  254.   void BaseMission_DelayedQuit()
  255.   {
  256.     if (m_bMissionQuit)
  257.       return;
  258.  
  259.     // call mission "QuitMission" handler
  260.     OnQuitMission();
  261.  
  262.     // quit this mission in 10 seconds
  263.     Core_ScheduleTask(
  264.       SOID_GameController,
  265.       OT_CallFunction,
  266.       10.0,
  267.       "OnQuitMission"
  268.     );
  269.  
  270.     m_bMissionQuit = true;
  271.   }
  272.  
  273.   void BaseMission_FastQuit()
  274.   {
  275.     if (m_bMissionQuit)
  276.       return;
  277.  
  278.     // call mission "QuitMission" handler
  279.     OnQuitMission();
  280.  
  281.     // quit this mission in 10 seconds
  282.     Core_ScheduleTask(
  283.       SOID_GameController,
  284.       OT_CallFunction,
  285.       1.5,
  286.       "OnQuitMission"
  287.     );
  288.  
  289.     m_bMissionQuit = true;
  290.   }
  291.  
  292.   //
  293.   //  Mission status screen
  294.   //
  295.   //  OnShowMissionStatus() is called from GameController
  296.   //
  297.  
  298.   bool m_bMissionStatusActive = false;
  299.  
  300.   void OnShowMissionStatus()
  301.   {
  302.     // no mission status screen if menu is active
  303.     if (m_bMissionMenuActive)
  304.       return;
  305.     if (m_bMissionHelpActive)
  306.       return;
  307.  
  308.     if (m_bMissionStatusActive)
  309.     {
  310.       OnHideMissionStatus();
  311.       return;
  312.     }
  313.  
  314.     StoreControlsState();
  315.     EnableControl("", false);
  316.     EnableControl(SOID_MissionMenu, true);
  317.  
  318.     Core_SendEventTo(
  319.       SOID_MissionMenu,
  320.       "BaseMenu_SetMissionStatus",
  321.       GetMissionObjectives(),
  322.       GetMissionObjectivesStatuses(),
  323.       GetBonusMissionObjectives(),
  324.       GetBonusMissionObjectivesStatuses(),
  325.       GetMissionStatistics(),
  326.       true,   // in-game flag, notifies that mission is not yet over
  327.               // and menu should display 'In progress' but not 'Failed'
  328.               // for incomplete objectives
  329.       false   // mission complete flag
  330.       );
  331.  
  332.     Core_CallFunction(
  333.       SOID_MissionMenu,
  334.       "GoToSubMenu",
  335.       "BaseMenu_ShowMissionStatus");
  336.  
  337.     PauseGame(true);
  338.  
  339.     m_bMissionStatusActive = true;
  340.   }
  341.  
  342.   void OnHideMissionStatus()
  343.   {
  344.     if (!m_bMissionStatusActive)
  345.       return;
  346.  
  347.     RestoreControlsState();
  348.     PauseGame(false);
  349.  
  350.     // go to the root of the mission menu
  351.     // so that user would see the root mission menu
  352.     // when he invokes mission menu next time
  353.     Core_CallFunction(SOID_MissionMenu, "GoToRootMenu");
  354.  
  355.     m_bMissionStatusActive = false;
  356.   }
  357.  
  358.   void OnQuitMission()
  359.   {
  360.     Core_SendEventTo(
  361.       SOID_GameController,
  362.       "OnSetMissionResult",
  363.       GetMissionObjectives(),
  364.       GetMissionObjectivesStatuses(),
  365.       GetBonusMissionObjectives(),
  366.       GetBonusMissionObjectivesStatuses(),
  367.       GetMissionStatistics()
  368.       );
  369.   }
  370.  
  371.   //
  372.   //  Mission menu
  373.   //
  374.   //  OnShowMissionMenu() is called from GameController
  375.   //
  376.  
  377.   bool m_bMissionMenuActive = false;
  378.  
  379.   void OnShowMissionMenu()
  380.   {
  381.     // no mission menu if mission status screen is active
  382.     if (m_bMissionStatusActive)
  383.       return;
  384.     if (m_bMissionHelpActive)
  385.       return;
  386.  
  387.     if (m_bMissionMenuActive)
  388.     {
  389.       OnHideMissionMenu();
  390.       return;
  391.     }
  392.  
  393.     StoreControlsState();
  394.     EnableControl("", false);
  395.     EnableControl(SOID_MissionMenu, true);
  396.     PauseGame(true);
  397.  
  398.     m_bMissionMenuActive = true;
  399.   }
  400.  
  401.   void OnForceMissionMenu()
  402.   {
  403.     if (m_bMissionMenuActive)
  404.       return;
  405.  
  406.     OnShowMissionMenu();
  407.   }
  408.  
  409.   void OnHideMissionMenu()
  410.   {
  411.     if (!m_bMissionMenuActive)
  412.       return;
  413.  
  414.     RestoreControlsState();
  415.     PauseGame(false);
  416.  
  417.     // the cursor might be hidden and locked by key control
  418.     // in the settings screen -- unlock and show to return to normal state
  419.     Core_CallFunction(SOID_MissionMenu, "ShowAndUnlockCursor");
  420.  
  421.     // go to the root of the mission menu
  422.     // so that user would see the root mission menu
  423.     // when he invokes mission menu next time
  424.     Core_CallFunction(SOID_MissionMenu, "GoToRootMenu");
  425.  
  426.     m_bMissionMenuActive = false;
  427.   }
  428.  
  429.   //
  430.   //  Mission help screen
  431.   //
  432.   //  OnShowMissionHelpScreen() is called from GameController
  433.   //
  434.  
  435.   bool m_bMissionHelpActive = false;
  436.  
  437.   void OnShowMissionHelpScreen()
  438.   {
  439.     // no mission status screen if menu is active
  440.     if (m_bMissionMenuActive)
  441.       return;
  442.     if (m_bMissionStatusActive)
  443.       return;
  444.  
  445.     if (m_bMissionHelpActive)
  446.     {
  447.       OnHideMissionHelpScreen();
  448.       return;
  449.     }
  450.  
  451.     StoreControlsState();
  452.     EnableControl("", false);
  453.     EnableControl(SOID_MissionMenu, true);
  454.  
  455.     Core_CallFunction(
  456.       SOID_MissionMenu,
  457.       "GoToSubMenu",
  458.       "BaseMenu_ShowMissionHelpScreen");
  459.  
  460.     PauseGame(true);
  461.  
  462.     m_bMissionHelpActive = true;
  463.   }
  464.  
  465.   void OnHideMissionHelpScreen()
  466.   {
  467.     if (!m_bMissionHelpActive)
  468.       return;
  469.  
  470.     RestoreControlsState();
  471.     PauseGame(false);
  472.  
  473.     // go to the root of the mission menu
  474.     // so that user would see the root mission menu
  475.     // when he invokes mission menu next time
  476.     Core_CallFunction(SOID_MissionMenu, "GoToRootMenu");
  477.  
  478.     m_bMissionHelpActive = false;
  479.   }
  480.  
  481.  
  482.   //
  483.   //  Service methods
  484.   //
  485.  
  486.   void PauseGame(bool _pause)
  487.   {
  488.     Core_CallFunction(SOID_GameController, "PauseGame", _pause);
  489.   }
  490.  
  491.   void StoreControlsState()
  492.   {
  493.     Core_CallFunction(SOID_GameController, "StoreControlsState");
  494.   }
  495.  
  496.   void RestoreControlsState()
  497.   {
  498.     Core_CallFunction(SOID_GameController, "RestoreControlsState");
  499.   }
  500.  
  501.   void EnableControl(string _control, bool _enable)
  502.   {
  503.     Core_CallFunction(SOID_GameController, "EnableControl", _control, _enable);
  504.   }
  505.  
  506.   //
  507.   //  Objectives
  508.  
  509.   array GetMissionObjectives()
  510.   {
  511.     return m_MissionObjectives;
  512.   }
  513.  
  514.   array GetMissionObjectivesStatuses()
  515.   {
  516.     return m_MissionObjectivesStatuses;
  517.   }
  518.  
  519.   void SetMissionObjectiveStatus(int _obj, string _status)
  520.   {
  521.     m_MissionObjectivesStatuses[_obj] = _status;
  522.   }
  523.  
  524.   //
  525.   //  Bonus objectives
  526.  
  527.   array GetBonusMissionObjectives()
  528.   {
  529.     return m_BonusMissionObjectives;
  530.   }
  531.  
  532.   array GetBonusMissionObjectivesStatuses()
  533.   {
  534.     return m_BonusMissionObjectivesStatuses;
  535.   }
  536.  
  537.   void SetBonusMissionObjectiveStatus(int _obj, string _status)
  538.   {
  539.     m_BonusMissionObjectivesStatuses[_obj] = _status;
  540.   }
  541.  
  542.   //
  543.   //  Mission statistics
  544.  
  545.   string GetMissionStatistics()
  546.   {
  547.     return "CBaseMission methods to override: 3";
  548.   }
  549.  
  550.   //
  551.   //  Mission navpoints
  552.  
  553.   array GetNavPoints()
  554.   {
  555.     array navpoints =
  556.       array(
  557.         vector(0, 0, 0),
  558.         vector(16000, 16000, 0)
  559.       );
  560.     return navpoints;
  561.   }
  562.  
  563.   array GetNavPointsDescriptions()
  564.   {
  565.     return m_NavigationPoints;
  566.   }
  567.  
  568.   //
  569.   //  Methods common to all missions
  570.   //
  571.  
  572.   void BaseMission_CompleteObjective(int _obj)
  573.   {
  574.     array objectives = GetMissionObjectives();
  575.     array statuses = GetMissionObjectivesStatuses();
  576.  
  577.     if (statuses[_obj] == str_ObjectiveComplete)
  578.       return;
  579.  
  580.     SetMissionObjectiveStatus(_obj, str_ObjectiveComplete);
  581.     Core_BroadcastEvent(
  582.       "OnDisplayMessage",
  583.       str_CompleteMessage + objectives[_obj],
  584.       m_ObjectiveCompleteMessageColor
  585.     );
  586.  
  587.     // check whether all base objectives are complete
  588.  
  589.     // refresh statuses
  590.     statuses = GetMissionObjectivesStatuses();
  591.  
  592.     // mission is complete if all the main objectives are complete
  593.     bool bMissionComplete = true;
  594.     for (int i = 0; i < statuses.size(); i = i + 1)
  595.     {
  596.       bMissionComplete = bMissionComplete && (statuses[i] == str_ObjectiveComplete);
  597.     }
  598.  
  599.     // check whether all bonus objectives are complete
  600.  
  601.     // refresh statuses
  602.     statuses = GetBonusMissionObjectivesStatuses();
  603.  
  604.     // mission is complete if all the main objectives are complete
  605.     bool bBonusMissionComplete = true;
  606.     for (int i = 0; i < statuses.size(); i = i + 1)
  607.     {
  608.       bBonusMissionComplete = bBonusMissionComplete && (statuses[i] == str_ObjectiveComplete);
  609.     }
  610.  
  611.     if (bMissionComplete)
  612.     {
  613.       // enable finish mission button in mission status screen
  614.       Core_SendEventTo(
  615.         SOID_MissionMenu,
  616.         "BaseMenu_EnableFinishMission");
  617.     }
  618.  
  619.     if (bMissionComplete && bBonusMissionComplete)
  620.       BaseMission_DelayedQuit();
  621.  
  622.     if (bMissionComplete && !bBonusMissionComplete)
  623.     {
  624.       // show mission status in 5 seconds
  625.       Core_ScheduleTask(
  626.         SOID_MissionController,
  627.         OT_CallFunction,
  628.         5.0,
  629.         "OnShowMissionStatus"
  630.       );
  631.     }
  632.   }
  633.  
  634.   void BaseMission_FailObjective(int _obj)
  635.   {
  636.     array objectives = GetMissionObjectives();
  637.     array statuses = GetMissionObjectivesStatuses();
  638.  
  639.     SetMissionObjectiveStatus(_obj, str_ObjectiveFailed);
  640.     Core_BroadcastEvent(
  641.       "OnDisplayMessage",
  642.       str_FailedMessage + objectives[_obj],
  643.       m_ObjectiveFailedMessageColor
  644.     );
  645.  
  646.     // one of the base objectives failed - quit
  647.     BaseMission_DelayedQuit();
  648.   }
  649.  
  650.   void BaseMission_CompleteBonusObjective(int _obj)
  651.   {
  652.     array objectives = GetBonusMissionObjectives();
  653.     array statuses = GetBonusMissionObjectivesStatuses();
  654.  
  655.     if (statuses[_obj] == str_ObjectiveComplete)
  656.       return;
  657.  
  658.     SetBonusMissionObjectiveStatus(_obj, str_ObjectiveComplete);
  659.     Core_BroadcastEvent(
  660.       "OnDisplayMessage",
  661.       str_CompleteMessage + objectives[_obj],
  662.       m_ObjectiveCompleteMessageColor
  663.     );
  664.  
  665.     // check whether all base and all bonus objectives are complete
  666.     // quit if true
  667.  
  668.     // refresh statuses
  669.     statuses             = GetMissionObjectivesStatuses();
  670.     array bonus_statuses = GetBonusMissionObjectivesStatuses();
  671.  
  672.     // mission is complete if all the main objectives are complete...
  673.     bool bMissionComplete = true;
  674.     for (int i = 0; i < statuses.size(); i = i + 1)
  675.     {
  676.       bMissionComplete = bMissionComplete && (statuses[i] == str_ObjectiveComplete);
  677.     }
  678.  
  679.     // ... and all bonus objectives are complete
  680.     for (int i = 0; i < bonus_statuses.size(); i = i + 1)
  681.     {
  682.       bMissionComplete = bMissionComplete && (bonus_statuses[i] == str_ObjectiveComplete);
  683.     }
  684.  
  685.     if (bMissionComplete)
  686.       BaseMission_DelayedQuit();
  687.   }
  688.  
  689.   void BaseMission_FailBonusObjective(int _obj)
  690.   {
  691.     array objectives = GetBonusMissionObjectives();
  692.     array statuses = GetBonusMissionObjectivesStatuses();
  693.  
  694.     SetBonusMissionObjectiveStatus(_obj, str_ObjectiveInProgress);
  695.     Core_BroadcastEvent(
  696.       "OnDisplayMessage",
  697.       str_FailedMessage + objectives[_obj],
  698.       m_ObjectiveFailedMessageColor
  699.     );
  700.   }
  701.  
  702.   void DestroyGameObject(string _ObjectId)
  703.   {
  704.     if (_ObjectId != "Helicopter")
  705.       DestroyComponent(_ObjectId);
  706.  
  707.     OnGameObjectDestroyed(_ObjectId);
  708.   }
  709. }
  710.  
  711. class CMissionMessageColors
  712. {
  713.   color m_ObjectiveCompleteMessageColor = color(0.0, 0.75, 0.0);
  714.   color m_ObjectiveFailedMessageColor   = color(1.0, 0.0, 0.0);
  715.  
  716.   color m_GoodNewsColor = color(0.0, 0.75, 0.0);
  717.   color m_BadNewsColor  = color(1.0, 0.0, 0.0);
  718.  
  719.   color m_ReminderColor = color(1.0, 1.0, 0.0);
  720. }
  721.